#pragma once
#include <iostream>
#include <fstream>
#include <utility>
#include <vector>
#include <memory>
#include <tuple>

template <typename DataType> class Vertex{
public:
	void set_id(int n){
		id = n;
	}

	void add_edge(std::shared_ptr<Vertex<DataType>> v, int weight, bool color = false){ // добавление ребра
		edges.push_back(std::make_tuple(v, weight, color));
	}

	void remove_edge(int edge_end){ // удаление ребра
		typename std::vector<std::tuple<std::shared_ptr<Vertex<DataType>>, int, bool>>::iterator it = edges.begin();
		while ((it != edges.end()) && ((*(std::get<0>(*it))).id != edge_end))
			it++;
		if (it != edges.end())
			edges.erase(it);
		else
			printf("Attempted to erase unexisting edge. Strange. There must be some bug.");
	}

	std::vector<std::pair<int, int>> invert(){ // разворот рёбер (удаляется текущее, добавляется обратное)
		unsigned int i = 0;
		std::vector<std::pair<int, int>> task;
		while (i < edges.size()){
			if (std::get<2>(edges[i]) == false){
				task.push_back(std::make_pair((*(std::get<0>(edges[i]))).id, std::get<1>(edges[i])));
				remove_edge((*(std::get<0>(edges[i]))).id);
			}
			else
				i++;
		}
		return task;
	}

	void restore_edges_color(){ // все рёбра становятся "необработанными"
		for (unsigned int i = 0; i < edges.size(); i++)
			std::get<2>(edges[i]) = false;
	}
	void restore(){ // удаление всех рёбер
		edges.clear();
	}

	std::vector<std::tuple<std::shared_ptr<Vertex<DataType>>, int, bool>> get_edges(){
		return edges;
	}
	int get_id(){
		return id;
	}

private:
	int id;
	DataType Data;
	std::vector<std::tuple<std::shared_ptr<Vertex<DataType>>, int, bool>> edges;
};